package com.designpatterns.filterpattern;

import java.util.ArrayList;
import java.util.List;

import com.designpatterns.filterpattern.impl.AndCriteria;
import com.designpatterns.filterpattern.impl.CriteriaFemale;
import com.designpatterns.filterpattern.impl.CriteriaMale;
import com.designpatterns.filterpattern.impl.CriteriaSingle;
import com.designpatterns.filterpattern.impl.OrCriteria;

public class CriteriaPatternDemo
{
	public static void main(String[] args)
	{
		List<Person> persons = new ArrayList<Person>();

		persons.add(new Person("Robert", "Male", "Single"));
		persons.add(new Person("John", "Male", "Married"));
		persons.add(new Person("Laura", "Female", "Married"));
		persons.add(new Person("Diana", "Female", "Single"));
		persons.add(new Person("Mike", "Male", "Single"));
		persons.add(new Person("Bobby", "Male", "Single"));

		Criteria male = new CriteriaMale();
		Criteria female = new CriteriaFemale();
		Criteria single = new CriteriaSingle();
		Criteria singleMale = new AndCriteria(single, male);
		Criteria singleOrFemale = new OrCriteria(single, female);

		System.out.println("Males: ");
		printPersons(male.meetCriteria(persons));

		System.out.println("\nFemales: ");
		printPersons(female.meetCriteria(persons));

		System.out.println("\nSingle Males: ");
		printPersons(singleMale.meetCriteria(persons));

		System.out.println("\nSingle Or Females: ");
		printPersons(singleOrFemale.meetCriteria(persons));
	}

	public static void printPersons(List<Person> persons)
	{
		for (Person person : persons)
		{
			System.out.println("Person : [ Name : " + person.getName() + ", Gender : " + person.getGender() + ", Marital Status : " + person.getMaritalStatus() + " ]");
		}
	}
}